﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Windows.Forms;

//using System.Runtime.Serialization;
//using System.Runtime.Serialization.Formatters.Binary;

using Sintaxe;
using Sintaxe.Instrucoes;
using ProcUtils;

namespace Montador
{
    public class tblLinhas : DataTable
    {
        // Congruente: o conteúdo da tabela é identico com um ProgMon gravado no disco rígido
        // O montador vai setar e resetar dependendo de operaçoes nos arquivos.
        // Esta instância vai resetar se tem mudanças do conteúdo

        private readonly string TipoProc;

        // Constructors ========================
        //
        //public tblLinhas() : base() { }
        public tblLinhas(string prmTipoProc)
            : base()
        {
            // Criar objeto de linhas vazio
            TipoProc = prmTipoProc;
            base.Columns.Add("RepVis", typeof(string));
            base.Columns.Add("Instrucao", typeof(Instrucao));
        }


        public tblLinhas(BinaryReader brFonte, string prmTipoProc) : base()
        {
            // criar objeto de linhas a base de dados em arquivo
            // invocado dentro da criação de um ProgMon; ProgMon é responsavel p/ TipoProc
            TipoProc = prmTipoProc;
            base.Columns.Add("RepVis", typeof(string));
            base.Columns.Add("Instrucao", typeof(Instrucao));

            DataRow rr;
            Instrucao ii;
            IProcessador pp = Portfolio.objProc(prmTipoProc);
            object[] args = new object[] { brFonte };

            int cc = brFonte.ReadInt32();
            for (int nn = 0; nn < cc; nn++)
            {
                ii = Portfolio.objInst(prmTipoProc, args);
                rr = this.NewRow();
                rr["Instrucao"] = (object)ii;
                rr["RepVis"] = ii.RepVisual(pp);
                this.Rows.Add(rr);
            }
        }


        public void Gravar(BinaryWriter bwFonte)
        {
            // gravar as linhas para um arquivo
            int cc;
            DataRow rr;

            AcceptChanges();
            cc = Rows.Count;
            bwFonte.Write(cc);

            for (int ii = 0; ii < cc; ii++)
            {
                // gravar somente as instruções
                // RepVisual será reconstruido apos a criaçao,
                // numeração é responsabilidade da visualização
                rr = Rows[ii];
                (rr.Field<Instrucao>(1)).Gravar(bwFonte);
            }

        }
    }
}
